//登录和注册需要的User类
var User = require('../models/user');
//发表需要的post类
var Post = require('../models/post');
//引入留言需要的Comment类
var Comment = require('../models/comment');
//需要引入一个加密的模块
var crypto = require('crypto');
//引入multer
var multer = require('multer');

//插件的基本信息
var storage = multer.diskStorage({
    //上传图片的地址
    destination: function (req, file, cb) {
        cb(null, './public/images')
    },
    //上传到服务器上图片的名字
    filename: function (req, file, cb) {
        cb(null, file.originalname)
    }
})
// size:10225限制大小 单位是字节数
var upload = multer({storage: storage, size: 10225})


//一个权限的问题
//1.用户未登录的情况下,无法访问/post /localhost
//2.用户在登录的情况下,无法访问/login,/reg
//如何解决权限制的问题?
function checkLogin(req, res, next) {
    if (!req.session.user) {
        req.flash('error', '请先登录!');
        res.redirect('/login')
    }
    next();
}
// 如果登录了无法访问登录和注册页面的
function checkNotLogin(req, res, next) {
    if (req.session.user) {
        req.flash('error', '已登录!');
        res.redirect('back')
    }
    next();
}
//在需要判断登录状态的页面执行checkLogin,checkNotLogin即可


module.exports = function (app) {
    app.get('/checkLogin', function (req, res) {
        res.render('checkLogin');
    })

    app.get('/checkNotLogin', function (req, res) {
        res.render('checkNotLogin')
    })
    //首页
    app.get('/', function (req, res) {
        var page = parseInt(req.query.p) || 1;
        //查询并返回第 page 页的 10 篇文章
        Post.getTen(null, page, function (err, posts, total) {
            if (err) {
                posts = [];
            }
            //console.log(page);
            res.render('index', {
                total: total,
                title: '主页',
                posts: posts,
                page: page,
                //判断是否是第一页
                isFirstPage: (page - 1) == 0,
                //判断是否是最后一页
                isLastPage: ((page - 1) * 3 + posts.length) == total,
                user: req.session.user,
                success: req.flash('success').toString(),
                error: req.flash('error').toString()
            })
        })
    })
    //注册页面
    app.get('/reg', function (req, res) {
        if (req.session.user) {
            return res.redirect('/checkLogin')
        }
        res.render('reg', {
            title: '注册',
            user: req.session.user,
            success: req.flash('success').toString(),
            error: req.flash('error').toString()
        })

    })
    //注册行为
    app.post('/reg', function (req, res) {
        // 1.收集用户的注册信息
        // 2.将用户注册信息传入到User类中,new 实例化一下
        // 3.调用User.save方法将数据存放到user集合中去
        // 4.跳转到登录页面完成
        // 5.可以给用户一个提示,想办法
        // console.log(req.body)

        var name = req.body.name;
        var password = req.body.password;
        var email = req.body.email;
        var repeatPassword = req.body['password-repeat'];
        // 补充一下,如果未填写的情况下
        if (name == '' || password == '' || repeatPassword == '' || email == '') {
            req.flash('error', '请填写正确信息!');
            return res.redirect('/reg')
        }
        //首先检查下两次密码是否一样
        if (password != repeatPassword) {
            //1.先保存下错误的信息
            req.flash('error', '用户两次输入的密码不一致!');
            return res.redirect('/reg');
        }
        //   2. 对密码进行加密处理
        var md5 = crypto.createHash('md5');
        var password = md5.update(req.body.password).digest('hex');
        // console.log(password);
        //   3.可以开始实例化User对象
        var newUser = new User({
            name: name,
            password: password,
            email: email
        })
        //4.检查用户名是否存在
        User.get(newUser.name, function (err, user) {
            //    如果发生了错误
            if (err) {
                req.flash('error', err);
                return res.redirect('/')
            }
            //如果存在重复的用户名
            // console.log(user);
            if (user) {
                req.flash('error', '用户名已存在');
                return res.redirect('/reg')
            }
            //    正确情况下
            newUser.save(function (err) {
                if (err) {
                    req.flash('error', err);
                }
                //    用户信息存入session
                // req.session.user = newUser;
                req.flash('success', '注册成功!')
                res.redirect('/')
            })
        })

    })
    //登录
    app.get('/login', function (req, res) {
        if (req.session.user) {
            return res.redirect('/checkLogin')
        }
        res.render('login', {
            title: '登录',
            user: req.session.user,
            success: req.flash('success').toString(),
            error: req.flash('error').toString()
        })

    })
    //登录行为
    app.post('/login', function (req, res) {
        // 1.检查下用户名有没有
        // 2.检查下密码对不对
        // 3.存储到session用户的登录信息
        // 4.跳转到首页
        //加密
        var md5 = crypto.createHash('md5');
        var password = md5.update(req.body.password).digest('hex');

        User.get(req.body.name, function (err, user) {
            if (!user) {
                // 说明用户名不存在
                req.flash('error', '用户名不存在!');
                return res.redirect('/login');
            }
            //检查两次密码是否一样
            if (user.password != password) {
                req.flash('error', '密码错误!');
                return res.redirect('/login');
            }
            req.session.user = user;
            req.flash('success', '登录成功!');
            res.redirect('/');
        })


    })
    //  发布页面
    app.get('/post', function (req, res) {
        if (!req.session.user) {
            return res.redirect('/checkNotLogin')
        }
        res.render('post', {
            title: '发布',
            user: req.session.user,
            success: req.flash('success').toString(),
            error: req.flash('error').toString()
        })
    })
    //  发布行为
    app.post('/post', function (req, res) {

        //当前session里面的用户信息
        var currentUser = req.session.user;

        var name = currentUser.name;
        var title = req.body.title;

        // 判断一下内容不能为空
        if (title == '' || req.body.post == '') {
            req.flash('error', '内容不能为空')
            return res.redirect('/post')
        }
        //添加一下标签信息
        var tags = [req.body.tag1, req.body.tag2, req.body.tag3];
        var post = new Post(currentUser.name, req.body.title, tags, req.body.post);

        post.save(function (err) {
            if (err) {
                req.flash('error', err);
                return res.redirect('/')
            }
            req.flash('success', '发表成功!');
            res.redirect('/')
        })

    })
    //上传页面
    app.get('/upload', function (req, res) {
        if (!req.session.user) {
            return res.redirect('/checkNotLogin')
        }
        res.render('upload', {
            title: '上传',
            user: req.session.user,
            success: req.flash('success').toString(),
            error: req.flash('error').toString()
        })
    })
    //  上传行为
    app.post('/upload', upload.array('field1', 5), function (req, res) {
        req.flash('success', '上传成功!')
        res.redirect('/upload');
    })

    //退出
    app.get('/logout', function (req, res) {
        if (!req.session.user) {
            return res.redirect('/checkNotLogin')
        }
        //  1.清除session
        //  2.给用户提示
        //  3.跳转到首页
        req.session.user = '';
        req.flash('success', '成功退出');
        res.redirect('/');
    })
    //点击用户名，可以看到用户发布的所有文章
    //引入分页
    app.get('/u/:name', function (req, res) {
        var page = parseInt(req.query.p) || 1;
        //检查用户是否存在
        User.get(req.params.name, function (err, user) {
            if (!user) {
                req.flash('error', '用户不存在!');
                return res.redirect('/');
            }
            //查询并返回该用户第 page 页的 10 篇文章
            Post.getTen(user.name, page, function (err, posts, total) {
                if (err) {
                    req.flash('error', err);
                    return res.redirect('/');
                }
                res.render('user', {
                    title: user.name,
                    posts: posts,
                    page: page,
                    isFirstPage: (page - 1) == 0,
                    isLastPage: ((page - 1) * 10 + posts.length) == total,
                    user: req.session.user,
                    success: req.flash('success').toString(),
                    error: req.flash('error').toString()
                });
            });
        });
    });
    //文章详情页面
    app.get('/u/:name/:second/:title', function (req, res) {
        Post.getOne(req.params.name, req.params.second, req.params.title, function (err, post) {
            if (err) {
                req.flash('error', '找不到当前文章');
                return res.redirect('/');
            }
            res.render('article', {
                title: req.params.name,
                user: req.session.user,
                post: post,
                success: req.flash('success').toString(),
                error: req.flash('error').toString()
            })
        })
    })

//文章留言发布
    app.post('/comment/:name/:second/:title', function (req, res) {
        var date = new Date();
        var time = date.getFullYear() + '-' +
            (date.getMonth() + 1) + '-' + date.getDate() + ' ' + date.getHours() + ':' +
            (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ":" +
            (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds())
        var comment = {
            name: req.body.name,
            time: time,
            content: req.body.content
        }
        var newComment = new Comment(req.params.name, req.params.second, req.params.title, comment)
        newComment.save(function (err) {
            if (err) {
                req.flash('error', err)
                return res.redirect('back')
            }

            req.flash('success', '留言发布成功!')
            res.redirect('back');

        })
    })
//    文章编辑页面
    app.get('/edit/:name/:second/:title', function (req, res) {
        if (!req.session.user) {
            return res.redirect('/checkNotLogin')
        }
        var currentUser = req.session.user;
        Post.edit(currentUser.name, req.params.second, req.params.title, function (err, post) {
            if (err) {
                req.flash('error', err)
                return res.redirect('back')
            }
            res.render('edit', {
                title: "编辑",
                post: post,
                user: req.session.user,
                success: req.flash('success').toString(),
                error: req.flash('error').toString()
            })
        })
    })
// 文章编辑行为
    app.post('/edit/:name/:second/:title', function (req, res) {
        var currentUser = req.session.user;
        Post.update(currentUser.name, req.params.second, req.params.title, req.body.post, function (err) {
            var url = encodeURI('/u/' + req.params.name + '/' + req.params.second + '/' + req.params.title);
            if (err) {
                req.flash('error', err)
                return res.redirect(url)
            }
            req.flash('success', '编辑成功!');
            res.redirect('/');
        })
    })
//删除文章行为
    app.get('/remove/:name/:second/:title', function (req, res) {
        if (!req.session.user) {
            return res.redirect('/checkNotLogin')
        }
        Post.remove(req.params.name, req.params.second, req.params.title, function (err) {
            if (err) {
                req.flash('error', err)
                return res.redirect('back');
            }
            req.flash('success', '删除成功!')
            res.redirect('/');
        })
    })
//文章存档
    app.get('/archive', function (req, res) {
        Post.archive(function (err, posts) {
            if (err) {
                req.flash('error', err)
                return res.redirect('/')
            }
            res.render('archive', {
                title: '存档',
                posts: posts,
                user: req.session.user,
                success: req.flash('success').toString(),
                error: req.flash('error').toString()
            });
        })
    })
//    文章标签页
    app.get('/tags', function (req, res) {
        Post.getTags(function (err, posts) {
            if (err) {
                req.flash('error', err);
                return res.redirect('/');
            }
            res.render('tags', {
                title: '标签',
                posts: posts,
                user: req.session.user,
                success: req.flash('success').toString(),
                error: req.flash('error').toString()
            });
        });
    });
//标签对应的文章集合
    app.get('/tags/:tag', function (req, res) {
        Post.getTag(req.params.tag, function (err, posts) {
            if (err) {
                req.flash('error', err);
                return res.redirect('/');
            }
            res.render('tag', {
                title: 'TAG:' + req.params.tag,
                posts: posts,
                user: req.session.user,
                success: req.flash('success').toString(),
                error: req.flash('error').toString()
            });
        });
    });
//    搜索
    app.get('/search', function (req, res) {
        Post.search(req.query.keyword, function (err, posts) {
            if (err) {
                req.flash('error', err);
                return res.redirect('/');
            }
            res.render('search', {
                title: 'SEARCH' + req.query.keyword,
                posts: posts,
                user: req.session.user,
                success: req.flash('success').toString(),
                error: req.flash('error').toString()
            });
        });
    });
};
